/*
 * RayTracer.h
 *
 *  Created on: 17/02/2013
 *      Author: alex
 */

#ifndef RAYTRACER_H_
#define RAYTRACER_H_

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

#include "utils.h"

enum tipo_parametro
{
	tipo_parametro_escena,
};

struct def_parametro
{
	enum tipo_parametro tipo;
	size_t num_prefijos;
	void* valor_default;
	int requerido;
	char* prefijos[8];
};

struct parametro
{
	const struct def_parametro * definicion;
	void* valor;
	int definido;
};

// Color RGB
typedef struct
{
  long double r;
  long double g;
  long double b;
} color_t;

// Imagen AVS
typedef struct nodo_imagen
{
  int height;
  int width;
  color_t **texel;
  struct nodo_imagen *siguiente;
} imagen_t;

// Plano de Corte
typedef struct nodo_plano
{
	long double A,B,C,D;
	struct nodo_plano *siguiente;
} plano_t;

// Nodo de la lista de luces
typedef struct nodo_luz
{
	long double Ip;
	long double Xp, Yp, Zp;
	long double C1, C2, C3;
	struct nodo_luz *siguiente;
} luz_t;

// Nodo de la lista de objetos
// Datos generales de todos los objetos
typedef struct nodo_objeto
{
	int tipo;
	color_t color;
	long double Kd, Ks, Kn, Ka, Kt;
	long double Ni;
	long double O1, O2, O3, O4;
	int texture_index, texture_type, calado_index, bump_index;
	long double valle, montana;
	long double TALTO, TANCHO;
	long double (* fIntersection) ();
	long double* (* VectorNormal) ();
	void* datos;
	long double *planosCorte;
	long double nPlanos;
	struct nodo_objeto *siguiente;
} objeto_t;

typedef struct
{
	int Hres, Vres;
	int NivelEspejos;
	int NivelTransparencia, TipoTransparencia;
	int NivelAntialiasing;

	color_t background;

	long double x_min, y_min, x_max, y_max;
	long double Xe, Ye, Ze;
	long double Ia;
	long double K1, K2;

	objeto_t *objetos;
	luz_t *luces;
	imagen_t *texturas, *calado, *bump;
	plano_t *planos;
} escena_t;


// Nodo de la lista de intersecciones
typedef struct nodo_interseccion
{
	long double distancia;
	objeto_t *objeto;
	struct nodo_interseccion *siguiente;
	struct nodo_interseccion *anterior;
} interseccion_t;


int Cortar(objeto_t *objeto, long double Xi, long double Yi, long double Zi);

#endif /* RAYTRACER_H_ */
